from utils.handle_yaml import get_yml_data
import requests
import inspect
import os
from config.Config import Config


class BaseAPI:
    def __init__(self, env='test', host_type='sgs_url', in_cookie=None, **kwargs):
        config_instance = Config(env)
        self.host = config_instance.get_url_by_type(host_type)
        self.data = self.load_config()

        self.headers = {'cookie': in_cookie} if in_cookie else {}
        self.headers.update(kwargs)

        print('模块 ： ', self.__class__.__name__)
        print('当前使用的 host 地址: ', self.host)

    def load_config(self):
        base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))  # 项目根目录
        config_path = os.path.join(base_dir, 'config', 'apiConfigPath.yml')
        return get_yml_data(config_path)[self.__class__.__name__]

    def requests_send(
        self,
        headers=None,
        data=None,
        json=None,
        path_params=None,   # ← 新增：用于路径占位符替换
        params=None,        # ← 新增：GET 或通用 query 参数
        **kwargs            # 允许 timeout、verify 等 requests 支持的参数
    ):
        """
        发送 HTTP 请求，支持 GET、POST、PUT、DELETE、PATCH
        - path_params：用于替换 URL 中的 {xxx}
        - params：querystring 参数
        """
        try:
            # 取当前业务方法在 yml 里的配置
            api_method_name = inspect.stack()[1][3]
            config_data = self.data[api_method_name]
            print('取到的地址是:', config_data)

            # 构建 URL
            url = f"{self.host}{config_data['path']}"
            # 路径参数替换
            if path_params:
                url = url.format(**path_params)

            print("请求的 URL:", url)

            # 合并 Headers
            request_headers = self.headers.copy()
            if headers:
                request_headers.update(headers)
            print("请求 Headers:", request_headers)

            method = config_data['method'].upper()

            # 不要把 path_params 继续往下传
            if 'path_params' in kwargs:
                kwargs.pop('path_params')

            # 如果传了 json（是 dict/list），不要 json.dumps；requests 会自己序列化
            # 如果你传的是字符串 body，则放到 data 里
            if method == 'GET':
                response = requests.get(url, headers=request_headers, params=(params or data), **kwargs)
            else:
                response = requests.request(
                    method,
                    url,
                    headers=request_headers,
                    params=params,
                    data=data if json is None else None,  # 传了 json 就不要再传 data
                    json=json,
                    **kwargs
                )

            # 尝试解析 JSON；不是 JSON 时返回文本
            try:
                return response.json()
            except ValueError:
                return {'status_code': response.status_code, 'text': response.text}

        except requests.RequestException as e:
            print(f"HTTP 请求异常: {e}")
            raise
        except Exception as e:
            print(f"接口错误: {e}")
            raise
